#ifndef CALIBRATIONPROCESSOR_HPP_
#define CALIBRATIONPROCESSOR_HPP_

//-----------------------------------------------------------------
// Includes
//-----------------------------------------------------------------
#include "Dataset.hpp"
#include "Pattern.hpp"
#include "PositionSet.hpp"
#include "../Vision/Camera.hpp"
#include "../Tools/Exceptions.hpp"
#include "../Tools/Singleton.hpp"
	
namespace Calibration
{
	//-----------------------------------------------------------------
	// Cette classe décrit la processus de calibrage
	//-----------------------------------------------------------------
	class CalibrationProcessor : public Tools::Singleton<CalibrationProcessor>
	{
		//-------------------------------------------------------------
		// Définition d'une relation d'amitié pour l'utilisation du 
		// singleton
		//-------------------------------------------------------------
		friend class Tools::Singleton<CalibrationProcessor>;
		
	public:	
		
		//-------------------------------------------------------------
		// Destructeur
		//-------------------------------------------------------------
		virtual ~CalibrationProcessor();
		
		//-------------------------------------------------------------
		// Processus de calibrage pour une caméra
		// -> calibrage de la caméra est effectué à partir du jeu de 
		//    données fourni en entrée. Les caractéristiques de la mire 
		//    utilisée lors de la création du jeu de données doivent 
		//    être également fournis
		//-------------------------------------------------------------
		//void CalibrateCamera( const Pattern & pattern, CalibrationDataset & data, Vision::Camera & camera ) throw (Tools::CalibrationFailed);
		void CalibrateCamera( const Pattern & pattern, CalibrationPositionSet & positionSet, CalibrationDataset & data, Vision::Camera & camera ) throw (Tools::CalibrationFailed);
		
	protected:
		
		//-------------------------------------------------------------
		// Recherche les points de la mire dans l'ensemble des images 
		// du jeu d'image.
		// 
		// Retourne une matrice 2xN contenant les coordonnées 2D des 
		// points trouvées de toutes les images.
		// Retourne une matrice 1xN contenant le nombre de points 
		// trouvés pour chaque image.
		//
		// Remarque : N est le nombre total de points trouvés dans 
		//    		  toutes les images
		//
		// Pre condition : la mire est totalement visible sur toutes les 
		// 				   images du jeu de données
		//-------------------------------------------------------------
		bool FindPatternPoints( const Pattern & pattern, CalibrationDataset & data, CvMat** coordinatesFoundPoints, CvMat** nbFoundPoint );
		
		//-------------------------------------------------------------
		// Constructeur et opérator d'affectation
		// -> empeche la construction direct d'objet
		//-------------------------------------------------------------
		CalibrationProcessor();
		CalibrationProcessor(const CalibrationProcessor & copy);
		CalibrationProcessor & operator=(const CalibrationProcessor & copy);
	};

}

#endif /*CALIBRATIONPROCESSOR_HPP_*/
